// 引入所需模块
const express = require('express');
const sql = require('mssql');
const dbConfig = require('./db.config');

// 引入路由
const exampleRoutes = require('./routes/example.routes');
const productionRoutes = require('./routes/production.routes');

// 创建Express应用
const app = express();
const PORT = process.env.PORT || 5000;

// 中间件配置
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// 添加CORS支持
app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  
  if (req.method === 'OPTIONS') {
    return res.status(204).end();
  }
  
  next();
});

// 使用路由
app.use('/api/example', exampleRoutes);
app.use('/api/production', productionRoutes);

// 创建数据库连接池
let pool;

// 初始化数据库连接
async function initializeDatabase() {
  try {
    pool = await sql.connect(dbConfig);
    console.log('成功连接到SQL Server数据库');
  } catch (error) {
    console.error('数据库连接失败:', error.message);
    // 每5秒尝试重新连接
    setTimeout(initializeDatabase, 5000);
  }
}

// 测试数据库连接的路由
app.get('/api/test-db', async (req, res) => {
  try {
    if (!pool || !pool.connected) {
      throw new Error('数据库未连接');
    }
    const result = await pool.request().query('SELECT @@version AS version');
    res.json({
      success: true,
      data: result.recordset
    });
  } catch (error) {
    res.status(500).json({
      success: false,
      message: error.message
    });
  }
});

// 404错误处理中间件
app.use((req, res, next) => {
  const error = new Error('未找到请求的资源');
  error.status = 404;
  next(error);
});

// 全局错误处理中间件
app.use((err, req, res, next) => {
  console.error('发生错误:', err);
  res.status(err.status || 500).json({
    success: false,
    message: err.message || '服务器内部错误'
  });
});

// 启动服务器并初始化数据库连接
// 使用0.0.0.0监听所有网络接口，支持localhost和192.168.1.128同时访问
app.listen(PORT, '0.0.0.0', () => {
  console.log(`服务器运行在端口 ${PORT}，监听地址: 0.0.0.0`);
  console.log(`可通过以下地址访问:`);
  console.log(`- http://localhost:${PORT}`);
  console.log(`- http://192.168.8.100:${PORT}`);
  initializeDatabase();
});

// 处理进程终止信号，关闭数据库连接
process.on('SIGINT', async () => {
  try {
    await sql.close();
    console.log('数据库连接已关闭');
  } catch (error) {
    console.error('关闭数据库连接时出错:', error.message);
  }
  process.exit(0);
});